home *** CD-ROM | disk | FTP | other *** search
- /* Fillit ACMD */
-
- #define TRUE 1
- #define FALSE 0
- #define NULL 0L
-
- /* pointer to a function that returns an 'int' */
- typedef int (*FPtr)();
- #define MAX_LEFT 50
-
- #undef DEBUG
-
-
- char *
- #ifdef DEBUG
- try(text, alert, getVar, setVar, defineVar,deleteVar)
- #else
- main(text, alert, getVar, setVar, defineVar,deleteVar)
- #endif DEBUG
- char *text;
- FPtr getVar, setVar, defineVar, deleteVar, alert;
- {
- register char c, *fromPtr, *toPtr, *temp;
- char *mem, *lineStart;
- long sz,i,col, left = 0, right = 75;
- register long space;
- char spaces[MAX_LEFT];
- int isCr = FALSE;
-
- #ifndef DEBUG
- if (!getVar("fillColumn", &right) || !getVar("leftFillColumn", &left))
- {
- alert("Unable to access vars");
- DisposPtr(text);
- return NULL;
- }
- #endif DEBUG
- if (left >= 50) { alert("'leftFillColumn' must be less than %ld!",MAX_LEFT); return text; }
- for (i = 0; i < left; i++) spaces[i] = ' ';
- spaces[left] = 0;
- sz = GetPtrSize(text);
-
- /* preserve the last CR if there is one */
- for (toPtr = text; *toPtr; toPtr++);
- if (*(toPtr - 1) == '\r') { *(toPtr-1) = 0; isCr = TRUE; }
-
- sz += ((sz / right) + 1) * (1 + left) + 5;
- if (!(mem = toPtr = NewPtrClear((long)sz)))
- {
- alert("Out of memory");
- return text;
- }
-
- /*
- Copy everything into the new block. Then, copy it back into the old block while
- elimanating CRs and duplicate white space. Finally, copy back into the new block
- adding CRs and new white space as required by 'leftFillColumn'
- */
- memmove(mem, text, (long)sz);
- mem[sz-1] = 0;
-
- toPtr = text; fromPtr = mem; space = TRUE;
- while (c = *fromPtr++)
- {
- if ((c == ' ') || (c == '\t') || (c == '\r'))
- {
- if (!space)
- {
- *toPtr++ = ' '; space = TRUE;
- }
- }
- else
- {
- *toPtr++ = c; space = FALSE;
- }
- }
- *toPtr = 0;
-
- /* last pass, add in extra spaces and CRs */
- fromPtr = text; toPtr = mem; col = 0;
- while (*fromPtr)
- {
- col = left;
- strcpy(toPtr, spaces);
- toPtr += left;
- lineStart = fromPtr;
-
- while ((col < right) && (*toPtr++ = *fromPtr++)) col++;
- if (!*(toPtr - 1)) { toPtr--; break; }
-
- for (temp = fromPtr; (*temp != ' ') && (temp > lineStart); temp--);
- if (temp <= lineStart)
- {
- /* just have to leave an overlong line */
- while ((*fromPtr != ' ') && *fromPtr) *toPtr++ = *fromPtr++;
- fromPtr++; *toPtr++ = '\r';
- }
- else
- {
- toPtr -= (fromPtr - temp);
- *toPtr++ = '\r';
- fromPtr = temp + 1;
- }
- }
- if (isCr) *toPtr++ = '\r';
- *toPtr = 0;
-
- if (toPtr > (mem + sz))
- {
- alert("Whoops, you better quit fast");
- return text;
- }
-
- /* clean up */
- DisposPtr(text);
- return mem;
- }
-
-
- #ifdef DEBUG
- main()
- {
- char *text = "(ascii 28 <c> scrollLeftCol)\r(ascii 29 <c> scrollRightCol)";
- char *ptr;
-
- ptr = NewPtr(200);
- memmove(ptr, text, 200L);
- try(ptr);
- }
- #endif DEBUG
-
-